package p2psvideo;

import java.util.LinkedList;
import java.util.List;

///时间队列
class TimeQueue {

	public static long INVALID_TIME = 0x8000000000000000L; 
	private List<Long> _times = new LinkedList<Long>();
	private long _lastOutputTime;
	public TimeQueue() {
		reset();
	}
	//重置队列
	public void reset() {
		_times.clear();
		_lastOutputTime = INVALID_TIME;
	}
	///获取最后输出的时间
	public long getLastOutputTime()
	{
		return _lastOutputTime;
	}
	
	///时间进入排序队列 t 如果是INVALID_TIME则失败
	public boolean enqueue(long t)
	{
		if (t == INVALID_TIME) return false;
		for(int i = _times.size()-1; i >= 0; i--) {
			long ct = _times.get(i);
			if (t > ct) {
				_times.add(i+1, t);
				return true;
			}
		}
		_times.add(0, t);
		return true;
	}
	
	/*!
	 * @brief 从队列中退出一个时间
	 * @note 如果队列中没有时间则返回INVALID_TIME
	 */
	public long dequeue()
	{
		if (_times.size() == 0) {
			return INVALID_TIME;
		}
		_lastOutputTime = _times.get(0);
		_times.remove(0);
		return _lastOutputTime;
	}
	
	/*!
	 * @brief 从队列中退出所有小于等于t的时间
	 * @note 如果t == INVALID_TIME 则行为同dequeue()
	 * 如果没有时间小于等于t的时间戳则返回INVALID_TIME
	 * 否则返回退出的最大的时间戳
	 */
	public long dequeueFrom(long t)
	{
		if (t == INVALID_TIME) return dequeue();
		boolean found = false;
		for(int i = 0; i < _times.size(); i++) {
			long ct =  _times.get(i);
			if (ct <= t) {
				_lastOutputTime = ct;
				_times.remove(i);
				i--;
				found = true;
			} else break;
		}
		if (!found) {
			_lastOutputTime = t;
			return INVALID_TIME;
		} else {
			return _lastOutputTime;
		}
	}
	public int size() {
		return _times.size();
	}

}
